package servidor.rn;

import java.rmi.AccessException;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import servidor.controladorsistema.rn.RNControladorSistema;
import servidor.controladorsistema.so.SOControladorSistemaEntrada;
import servidor.controladorsistema.so.SOControladorSistemaEntradaImpl;
import servidor.gerenciadorsalasjogo.rn.RNGerenciadorSalasJogo;
import servidor.gerenciadorsalasjogo.so.SOGerenciadorSalasJogoEntrada;
import servidor.gerenciadorsalasjogo.so.SOGerenciadorSalasJogoEntradaImpl;
import servidor.gerenciadorsalasjogo.so.SOGerenciadorSalasJogoSaidaImpl;
import servidor.iu.IUServidor;
import servidor.so.SOServidorEntradaImpl;
import servidor.so.SOServidorSaida;
import servidor.so.SOServidorSaidaImpl;

import comum.so.SOServidorEntrada;

public class RNServidor {

	private static String NOME_SERVIDOR = "servidorDomino";

	private SOServidorSaida servidorSaida;

	public RNServidor(SOServidorSaida servidorSaida) {
		this.setServidorSaida(servidorSaida);
	}

	public static void main(String[] args) throws AccessException,
			RemoteException, AlreadyBoundException, NotBoundException {
		SOControladorSistemaEntrada controladorSistemaEntrada = new SOControladorSistemaEntradaImpl(
				new RNControladorSistema());

		SOGerenciadorSalasJogoSaidaImpl gerenciadorSalasJogoSaida = new SOGerenciadorSalasJogoSaidaImpl();

		SOGerenciadorSalasJogoEntrada gerenciadorSalasJogoEntrada = new SOGerenciadorSalasJogoEntradaImpl(
				new RNGerenciadorSalasJogo(gerenciadorSalasJogoSaida));
		SOServidorSaida servidorSaida = new SOServidorSaidaImpl(
				controladorSistemaEntrada, gerenciadorSalasJogoEntrada);
		SOServidorEntradaImpl servidorEntrada = new SOServidorEntradaImpl(
				servidorSaida);

		new IUServidor(new RNServidor(servidorSaida));

		gerenciadorSalasJogoSaida.setServidorEntrada(servidorEntrada);
		System.setSecurityManager(new SecurityManager());
		Registry r = LocateRegistry.getRegistry();
		r.rebind(NOME_SERVIDOR, servidorEntrada);
	}

	public void fecharServidor() {
		try {
			getServidorSaida().informarFechamentoServidor();
			Registry r = LocateRegistry.getRegistry();
			r.unbind(NOME_SERVIDOR);
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
	}

	protected SOServidorSaida getServidorSaida() {
		return servidorSaida;
	}

	protected void setServidorSaida(SOServidorSaida servidorSaida) {
		this.servidorSaida = servidorSaida;
	}

}
